<?php
/**
 * CLI 参数类
 */
final class CLI_Args
{

    /**
     * 参数命令
     *
     * @var string
     */
    protected $command = NULL;

    /**
     * 参数数据
     *
     * @var array
     */
    protected $args = array();

    /**
     * 构造方法
     *
     * @param  array  $argv
     * @throws Kohana_Exception
     */
    public function __construct(array $argv)
    {
        if ( ! (isset($argv[1]) AND preg_match('#^[a-z]\w*$#i', $argv[1])))
        {
            throw new Kohana_Exception('参数错误，输入 cli help 查看帮助信息');
        }

        $this->command = $argv[1];

        if (count($argv) > 2)
        {
            $argv = array_slice($argv, 2);
            foreach ($argv as $arg)
            {
                if (Kohana::$is_windows)
                {
                    // 将 cmd 模式下的输入转换为 utf8 编码
                    $arg = mb_convert_encoding($arg, 'UTF-8', 'GB2312');
                }

                if (preg_match('/\-\-[a-z]\w*=[^\s]*/i', $arg))
                {
                    $pos = strpos($arg, '=');

                    // 获取参数名与值
                    $this->args[substr($arg, 2, $pos - 2)] = substr($arg, $pos + 1);
                }
                else
                {
                    $this->args[] = $arg;
                }
            }
        }
    }

    /**
     * 获取所有参数
     *
     * @return array
     */
    public function as_array()
    {
        return $this->args;
    }

    /**
     * 获取参数
     *
     * @param  mixed  $name
     * @param  mixed  $default
     * @return mixed
     */
    public function get($name, $default = NULL)
    {
        return isset($this->args[$name]) ? $this->args[$name] : $default;
    }

    /**
     * 魔术方法，获取参数
     */
    public function __get($name)
    {
        return $this->get($name);
    }

    /**
     * 设置参数
     *
     * @param  mixed  $name
     * @param  mixed  $value
     * @return CLI_Args
     */
    public function set($name, $value = NULL)
    {
        if (is_string($name))
        {
            $this->args[$name] = $value;
        }
        elseif (is_array($name))
        {
            foreach ($name as $key => $val)
            {
                $this->set($key, $val);
            }
        }

        return $this;
    }

    /**
     * 魔术方法，设置参数
     *
     * @param  string  $name
     * @param  mixed   $value
     */
    public function __set($name, $value)
    {
        $this->set($name, $value);
    }

    /**
     * 魔术方法，判断参数是否存在
     *
     * @param  string  $name
     */
    public function __isset($name)
    {
        return isset($this->args[$name]);
    }

    /**
     * 魔术方法，删除参数
     *
     * @param  string  $name
     */
    public function __unset($name)
    {
        unset($this->args[$name]);
    }

    /**
     * 魔术方法，输出参数的命令脚本
     *
     * @param  string  $name
     */
    public function __toString()
    {
        return $this->command;
    }

}